package com.jade.bss.base.account;

import java.util.List;

import com.jade.bss.base.BssException;
import com.jade.framework.base.criterion.Criteria;
import com.jade.framework.base.util.PagingList;


/**
 * 账户数据访问接口。
 *
 * @author dwzhang
 * @version 1.0 12-04-22 下午9:50
 */
public interface AccountDao
{
    /**
     * 创建账户。
     *
     * @param account 账户对象
     * @throws BssException 处理异常
     */
    public void addAccount(Account account)
            throws BssException;


    /**
     * 更新账户信息，包括余额、冻结额、预扣费额等等。
     *
     * @param account 账户信息
     * @throws BssException 处理异常
     */
    public void updateAccount(Account account)
            throws BssException;

    /**
     * 更新或者重设账户信息，包括余额、冻结额、预扣费额等等。
     *
     * @param account 账户信息
     * @param remnant 表示变化的余额，正数为新增，负数为减少
     * @param prepay  表示变化的预扣款，正数为新增，负数为减少
     * @param freeze  表示变化的冻结额，正数为新增，负数为减少
     * @throws BssException 处理异常
     */
    public void updateAccount(Account account, long remnant, long prepay, long freeze)
            throws BssException;

    /**
     * 获取账户信息。
     *
     * @param type         账户类型
     * @return 账户信息
     */
    public Account getAccount(String ownerType, String ownerId, String type);

    /**
     * 获取企业所有账户列表。
     *
     * @return 账户列表
     */
    public List<Account> listAccount(String ownerType, String ownerId);

    /**
     * 获取账户信息。
     *
     * @param id 账户标识
     * @return 账户信息
     */
    public Account getAccount(long id);

    /**
     * 删除账户信息。
     *
     * @param id 账户标识
     * @throws BssException 处理异常
     */
    public void removeAccount(long id)
            throws BssException;

    /**
     * 删除账户信息。
     *
     * @param type         账户类型
     * @throws BssException 处理异常
     */
    public void removeAccount(String ownerType, String ownerId, String type)
            throws BssException;

    /**
     * 删除所有账户信息。
     *
     * @throws BssException 处理异常
     */
    public void removeAllAccount(String ownerType, String ownerId)
            throws BssException;

    /**
     * 增加账户记录。
     *
     * @param accountRecord 账户记录
     * @throws BssException 处理异常
     */
    public void addAccountRecord(AccountRecord accountRecord)
            throws BssException;

    /**
     * 修改账户记录
     * @param accountRecord
     * @throws BssException
     */
    public void updateAccountRecord(AccountRecord accountRecord)
            throws BssException;

    /**
     * 获取账户记录信息。
     *
     * @param recordId 账户记录标识
     * @return 帐户记录
     */
    public AccountRecord getAccountRecord(long recordId);

    /**
     * 查询账户列表
     * @param criteria
     * @return
     */
    public PagingList<Account> queryAccount(Criteria criteria);

    /**
     * 查询账户记录。
     *
     * @param criteria     查询条件
     * @return 账户记录
     */
    public PagingList<AccountRecord> queryAccountRecord(Criteria criteria);
}
